PHP
PHP
一、服务器知识
1 基础知识
基础知识:
official::W3C:制定规范。
其他知识:
- C/S(胖客户端),B/S(瘦客户端)
- PWA:Progressive web app
- 浏览器 flash 默认关闭。
- 服务端技术:CGI,PHP,ASP,JSP,ASP.NET
- MIME(多用途网际邮件扩充协议):是一种标准,用来表示文档、文件或字节流的性质和格式。 MIME
WAMP是指: Windows + Apache + Mysql + PHP
LAMP是指:Linux + Apache + Mysql + PHP
传统内核 | 对应浏览器 | 新内核 |
---|---|---|
Trident | IE | |
T+W(双核) | 搜狗,360,遨游 | |
Webkit | Safari | |
Webkit | Chrome | Blink(微信小程序内核) |
Presto | Opera | Blink |
Gecko | Firefox | Servo |
2 服务器搭建
- 购买服务器:
- 远程连接:
- 下载宝塔:
二、PHP语言基础
1 定义
PHP是一种运行在服务器端的脚本语言,可以嵌入到 HTML 中。
标记方式(前两种基本弃用,开启:php.ini——short_open_tag / asp_tags):
- ASP标记:
<% code %>
- 短标记:
<? code ?>
(“<?=”是PHP的一个短的开放式标签,是echo() 的快捷用法。)- 脚本标记:
<script language="php">code</script>
- 标准标记(常用):
<?php code ?>
注释:
- 行注释:// #
- 块注释:/ /
语句间用
;
隔开,?>
会自带所以最后一个语句可以不写。注:
<?php code ?>
使用时可以不写 ?>,这样后面的空行都会解析成php而不是html,从而节约行数。
2 变量与常量
// 定义 |
3 内存
区域:
- 栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快。
- 代码段:存储程序的内存部分(不执行)。
- 数据段:存储普通数据(全局区和静态区)。
- 堆区:存储复杂数据,大但是效率低。
传递:
- 值传递:
$a = $b ;
,在数据段重新生成数据。- 引用传递:
$a = &$b;
,地址传递。
4 文件包含
在一个PHP脚本中去将另一个文件的执行结果包含进来。
文件包含的意义:
要么使用被包含文件中的内容,实现代码的共享(重用):向上包含(索要,在当前脚本要用某个代码之前包含别的文件)
要么自己有东西可以给别的文件使用,实现代码的共享(重用):向下包含(给予,在自己有某个东西的时候,需要别的脚本来显示(自己代码写完之后包含其他文件)
最大的作用:分工协作,每个脚本做的事情不一样,因此可以使用协作方式,让多个脚本共同完成一件事情。
在PHP中文件的包含有四种形式:(两种大形式)
lnclude()
:包含文件。Include_once()
:系统会自动判断文件包含过程中,是否已经包含过(一个文件最多被包含一次)。Require()
:与include相同Require_once()
:与include_once相同包含代码:
Include 'file'或Include('file');
Include与Require:本质一样,但Include报错是Warning,不影响后面可执行代码的执行;而Require报错是Fatal error,后面语句将不会执行。
PHP代码的执行流程:
- 读取代码文件。(PHP程序)
- 编译:将PHP代码转换成字节码。(生成opcode)
- zendengine来解析opcode,按照字节码去进行逻辑运算。
- 转换成对应的HTML代码。
文件加载原理:
- 在文件加载( include 或者require〉的时候,系统会自动的将被包含文件中的代码相当于嵌入到当前文件中
- 加载位置:在哪加载,对应的文件中的代码嵌入的位置就是对应的include位置
- 在PHP中被包含的文件是单独进行编译的。
PHP文件在编译的过程中如果出现了语法错误,那么会失败〈不会执行);但是如果被包含文件有错误的时候,系统会在执行到包含include这条语句的时候才会报错。
注意路径:相对路径指的是当前执行文件下的路径(多次包含文件时可能会失效),可以用
"file/file.php"
而非"./file/file.php"
。
5 数据类型
PHP是一种弱类型语言,变量本身没有数据类型。
区分:三大类八小类。
简单(基本)数据类型:4个小类:
- 整型:int/integer,系统分配4个字节存储,表示整数类型(有前提)
- 浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
- 字符串型: string,系统根据实际长度分配,表示字符串(引号)
- 布尔类型:bool/boolean,表示布然类型,只有两个值: true和 false
复合数据类型:2个小类:
- 对象类型:object,存放对象(面向对象)
- 数组类型: array,存储多个数据(一次性)
特殊数据类型:2个小类:
- 资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
- 空类型:NULL,只有一个值就是NULL(不能运算)
类型转化方式:自动转化,手动转化:
(int)$a
字符串转数字:
- 以字母开头的字符串,永远为0
- 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
// 类型判断 |
6 运算符
运算符大部分同理c语言
// 数值判断 |
7 输入输出
// 输出一个或多个语句或变量。(不能输出bool判断,数组,类等) |
8 判断
同C
endif,endswitch
// 一定要用三等于,否则找到位置为0时一样是false。 |
9 循环
同C
endwhile(没有dowhile),endforeach
为了美观可以把 for的:
- “{“ 替换成 “:”
- “}” 替换成 “endfor”
// 下面两者等价 |
10 字符串
单双引号:
- 单引号:不解释,直接输出。
- 双引号:变量解释后输出。
结构化字符串:
会保持原有结构,所有东西都是字符串。(要识别变量应当加引号)
如:
"$a"
// limit:边界符,首尾应当一致,首尾后不跟东西,尾必须顶格。 |
// 字符串长度 |
11 数组
不填下标默认从最大数字下标向后加。
下标所有都是整数:索引数组。
下标所有都是字符串:关联数组。
下标混合:混合数组。
true,false,null 自动变成 1,0,” “。
// 定义数组(类似 js) |
12 函数
12.1 自定义函数
同C++:默认值。
不同C:函数定义可以放在函数执行之后,因为他会先编译再执行,编译时代码段已经有了函数。
// 定义函数 |
12.2 输出
// 输出,本质是结构不是函数,返回1,可以不用括号。 |
12.3 时间
// 日期(参数一填格式化输出, y m d h i s分别表示年月日时分秒,后一个表示时间戳,默认当前) |
12.4 数学
max(); |
12.5 函数参数
// 检测函数名字是否存在 |
12.6 检验函数
// 检验$var是否定义。已定义检测是否不为NULL |
12.7 正则表达式
# 首个匹配则终止($pattern="/ exp /":双斜杠中写表达式) |
13 文件
13.1 文件读写
// 打开文件(方式rwax,+,b)(x是只写,w是写入) |
13.2 文件操作
// 文件操作 |
13 类与对象
# 大体同c++:private,public,$this-> |
# 继承 |
14 错误
错误代号:
所有看到的错误代码在PHP中都被定义成了系统常量。(可以直接使用)
所有以E开头的错误常量(代号)其实都是由一个字节存储,然后每一种错误占据一个对应的位,如果想进行一些错误的控制,可以使用位运算进行操作。
错误类型:
- 系统错误:系统内置的错误。
- 用户错误:用户在使用自定义错误触发的时候,会使用到的错误代号。(系统不会用到)
- 其他错误
错误显示设置:哪些错误该显示,以及该如何显示。
在PHP中,其实有两种方式来设置当前脚本的错误处理:
PHP的配置文件:
- php.ini文件:全局配置。
- Display_errors:是否显示错误。
- Error_reporting:显示什么级别的错测。
- error_log:错误日志路径。(log_errors:开启错误日志)
可以在运行的PHP脚本中去设置:(级别比配置文件高)
Error_reporting()
:设置对应的错误显示级别。(没有参数表示当前错误级别)
lniset('配置文件中的配置项',配置值);
lni_set('error..reporting',E_ALL);
lni_set('display_errors',1);
系统错误 | 错误效果 |
---|---|
E_PARSE | 编译错误,代码不会执行 |
E_ERROR | fatal error,致命错误,会导致代码不能正确继续执行(出错的位置断掉) |
E_WARNING | warning,警告错误,不会影响代码执行,但是可能得到意想不到的结果 |
E_NOTICE | notice,通知错误,不会影响代码执行 |
用户错误 | 错误效果 |
E_USER_ERROR | fatal error |
E_USER_WARNING | warning |
E_USER_NOTICE | notice |
其他错误 | 错误效果 |
E_ALL | 代表着所有从错误(通常在进行错误控制的时候使用比较多),建议在开发过程中(开发环境)使用。 |
// 排除通知级别notice |
// 抛出错误('str':错误提示,error:抛出错误类型(默认notice)) |
15 伪类型
实际不存在的类型,便于学习:
- Mixed:混合类型。
- Number:数值类型。
三、PHP动态交互
1 Web交互编程
1.1 收发数据
// 获得post数据 |
1.2 header()
# header()是向浏览器传一个HTTP响应头信息 |
1.3 缓冲发送
没开启缓冲区时,程序执行输出的内容都是直接输出到浏览器的。
开启后,程序执行输出的内容会先存入缓冲区,之后再根据后续代码或脚本执行完成再发送给浏览器。
# 打开输出缓冲区 |
2 获得缓存
2.1 Cookie
cookie是小文本文件。
小是防止服务器写入巨大的垃圾信息给客户端。
文本文件是指文件不可执行,防止服务器写入恶意代码给客户端。
cookie安全:cookie修改 伪造 盗取
// 设置cookie(cookie名,cookie值,过期时间,有效目录,有效域名,是否HTTPS,是否只可http) |
2.2 Session
Session
用于存储用户的信息。存储于Session
中的变量持有单一用户的信息,并且对于一个应用程序中的所有页面都是可用的,用session_id
来标识每一个会话。注意事项:
session_start()
函数前面不能有任何代码输出到浏览器,最好加在页面头部,或先用ob_start()函数打开输出缓冲区。- 对一个不存在的Session变量赋值,将自动创建该变量。已存在则修改值。
- 如果新打开一个浏览器访问同一网页则无法获得Session信息。因为新开一个浏览器相当于一个新的用户在访问。
- 只要创建了Session变量,该Session变量就能被网站中的所有页面访问。
有效期:默认24分钟(1440秒)
修改session有效期:
- 修改
php.ini
中的默认值,session.gc_maxlifetime=1440;
- 使用
ini_set()
方法修改session有效期session安全:会话劫持(session劫持,在PHPSESSID有效期内使用)
// session使用 |
2.3 区别
- Cookie限制大小,每个文件不超过4KB,每个站点最多设置20个Cookie。(不同浏览器可能不同)
- Session 仍然要通过 Cookie 实现,因为用户的 Session ID 必须保存在会话的 Cookie 中。
相似点 | Session | Cookie |
---|---|---|
功能 | 存储和跟踪特定用户的信息 | 存储和跟踪特定用户的信息 |
优势 | 在整个网站的所有页面都可以访问 | 在整个网站的所有页面都可以访问 |
不同点 | Session | Cookie |
建立方式 | 每次访问网页时会自动建立Session对象 | 需要通过代码建立 |
存储位置 | 服务器端 | 客户端 |
应用场合 | 记住正在访问的用户信息 | 记住曾经访问过的用户信息 |
3 文件上传
如果表单中有文件上传域,则定义表单时必须设置
enctype="multipart/form-data",method=post
如果要限制上传文件的大小,可以在表单中添加一个隐藏域:
<input type="hidden" name="MAX_FILE_SIZE" value="10240">
。该隐藏域必须放在文件上传域的前面,否则设置会失效。
// 获取上传文件的信息 |
错误号 | 说明 |
---|---|
0 | 文件上传成功,没有错误发生 |
1 | 上传文件的大小超过了 php.ini 中 upload_max_filesize 选项限定的值 |
2 | 上传文件大小超过了表单隐藏域中 MAX_FILE_SIZE 选项指定的值 |
3 | 只上传了部分文件,如上传过程中网络中断 |
4 | 没有上传的文件,如没有选择上传文件就直接单击“上传”按钮 |
6 | 找不到临时文件夹 |
7 | 服务器上临时文件写入失败,通常是权限不够 |
8 | 上传的文件被PHP扩展程序中断 |
4 访问数据库
4.1 MySQL数据库
路径:http://127.0.0.1/phpMyAdmin
默认账号密码:root——root
4.2 PDO函数
// 连接数据库,初始化pdo |
4.3 防止sql注入查询
// 1.占位符占位(任意选一种) |
4.4 PDO流程案例
// PDO |
4.5 PDO事务操作
// 开启事务,关闭自动提交模式 |
4.6 PDO事务案例
|
5 cURL
// cURL流程 |
// 多线程同时访问网页,结果保存到$res中 |
// cURL检测网页是否正常 |
四、PHP安全编程
1 安全配置
配置都在
php.ini
中
2 SQL注入
// 1.addslashes |
3 跨站脚本
# 1.htmlspecialchars,将下列实体进行转化:<,>,&,",' |
4 身份认证
// 安全函数 |
// 验证码生成 |
5 编程流程
// 1.头文件中文设置 |
五、PHP技巧
1 显示中文
任选一种:
html方式:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
数据包方式:
`<?php header('Content-type:text/html;charset=utf-8'); ?>